#ifndef PAGEDISPLAYSTRATEGY_H
#define PAGEDISPLAYSTRATEGY_H

#include <QImage>
#include <QString>
#include "pagerendercontext.h"
#include "processingsettings.h"

/**
 * @brief Martin Fowler重构：Strategy Pattern for Page Display
 *
 * 解决代码异味：
 * - Long Method: PageView中的复杂条件分支逻辑
 * - Switch Statement: 分散的页面渲染逻辑
 * - Duplicate Code: 各组件重复的页面处理逻辑
 *
 * 设计原则：
 * - Strategy Pattern: 封装不同的页面显示算法
 * - Template Method: 标准化渲染流程
 * - Dependency Injection: 策略可替换
 */
class PageDisplayStrategy
{
public:
    virtual ~PageDisplayStrategy() = default;

    /**
     * @brief 渲染页面 - Template Method
     *
     * @param image 原始图像
     * @param context 渲染上下文
     * @param settings 处理设置
     * @return 渲染后的图像
     */
    virtual QImage renderPage(const QImage& image,
                             const PageRenderContext& context,
                             const ProcessingSettings* settings) = 0;

    /**
     * @brief 计算显示尺寸
     */
    virtual QSize calculateDisplaySize(const QImage& image,
                                     const PageRenderContext& context) = 0;

    /**
     * @brief 是否需要页码渲染
     */
    virtual bool needsPageNumberRendering() const = 0;

    /**
     * @brief 获取策略名称（用于调试）
     */
    virtual QString getStrategyName() const = 0;

protected:
    /**
     * @brief 通用页码渲染逻辑
     */
    QImage renderPageNumber(const QImage& image,
                           const PageRenderContext& context,
                           const ProcessingSettings* settings);

    /**
     * @brief 通用图像增强逻辑
     */
    QImage applyImageEnhancements(const QImage& image,
                                 const ProcessingSettings* settings);
};

/**
 * @brief 简单显示策略 - 原图显示，不添加页码
 */
class SimpleDisplayStrategy : public PageDisplayStrategy
{
public:
    QImage renderPage(const QImage& image,
                     const PageRenderContext& context,
                     const ProcessingSettings* settings) override;

    QSize calculateDisplaySize(const QImage& image,
                             const PageRenderContext& context) override;

    bool needsPageNumberRendering() const override { return false; }

    QString getStrategyName() const override { return "SimpleDisplay"; }
};

/**
 * @brief 页码显示策略 - 添加页码渲染
 */
class PageNumberDisplayStrategy : public PageDisplayStrategy
{
public:
    QImage renderPage(const QImage& image,
                     const PageRenderContext& context,
                     const ProcessingSettings* settings) override;

    QSize calculateDisplaySize(const QImage& image,
                             const PageRenderContext& context) override;

    bool needsPageNumberRendering() const override { return true; }

    QString getStrategyName() const override { return "PageNumberDisplay"; }
};

/**
 * @brief 导出显示策略 - 包含完整的页码和增强处理
 */
class ExportDisplayStrategy : public PageDisplayStrategy
{
public:
    QImage renderPage(const QImage& image,
                     const PageRenderContext& context,
                     const ProcessingSettings* settings) override;

    QSize calculateDisplaySize(const QImage& image,
                             const PageRenderContext& context) override;

    bool needsPageNumberRendering() const override { return true; }

    QString getStrategyName() const override { return "ExportDisplay"; }
};

#endif // PAGEDISPLAYSTRATEGY_H